﻿Option Infer On

Imports FairShop.Objects
Imports System.ComponentModel
Imports FairShop.Operaties

''' <summary>
''' Scherm om een verkoop te tonen (bv. kasblad of verkoop per factuur) of om een nieuwe verkoop aan te maken
''' </summary>
''' <remarks></remarks>
Public Class VerkoopForm

    Public Enum Modus
        Nieuw
        Bestaand
    End Enum

    Private _modus As Modus
    Private _myVerkoopRow As ArtikelsDataSet.VerkopenRow

#Region "Public properties"

    Public ReadOnly Property IdVerkoop() As Integer
        Get
            Return _myVerkoopRow.Id
        End Get
    End Property

    Private _kanBewaren As Boolean
    Public Property KanBewaren() As Boolean
        Get
            Return _kanBewaren
        End Get
        Set(ByVal value As Boolean)
            _kanBewaren = value
            tsbBewaren.Enabled = value
        End Set
    End Property

#End Region

#Region "Constructor/Initialisatie"

    ''' <summary>
    ''' Constructor voor het aanmaken van een nieuwe verkoop
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub New()
        InitForm()

        Dim eindTotaalVorigeVerkoop As Decimal = ArtikelsBL.LaatsteVerkoopEindTotaalOphalen()

        ' maak de nieuwe verkoop aan
        _myVerkoopRow = Me.InitialiseerVerkoop(eindTotaalVorigeVerkoop)
        Me.VerkopenBindingSource.Position = Utility.Data.Verkopen.Rows.IndexOf(_myVerkoopRow)
        UpdateTotaal()

        tsbDetails.Enabled = False
        tsbAfdrukken.Enabled = False

        _modus = Modus.Nieuw
        Me.Text = "Verkoop toevoegen"
    End Sub

    ''' <summary>
    ''' Constructor voor het bijwerken van een bestaande verkoop
    ''' </summary>
    ''' <param name="idVerkoop"></param>
    Public Sub New(ByVal idVerkoop As Integer)
        InitForm()
        _myVerkoopRow = Utility.Data.Verkopen.FindById(idVerkoop)
        Me.VerkopenBindingSource.Position = Utility.Data.Verkopen.Rows.IndexOf(_myVerkoopRow)
        UpdateTotaal()

        tsbDetails.Enabled = True
        tsbAfdrukken.Enabled = True

        _modus = Modus.Bestaand
        Me.Text = "Verkoop wijzigen"
    End Sub

    Private Sub InitForm()
        InitializeComponent()

        Me.KlantenBindingSource.DataSource = Utility.Data
        Me.WinkeliersBindingSource.DataSource = Utility.Data
        Me.VerkoopSoortenBindingSource.DataSource = Utility.Data
        Me.VerkopenBindingSource.DataSource = Utility.Data

        Me.DialogResult = DialogResult.Cancel
        KanBewaren = False
        SetSecurity()
    End Sub

#End Region

#Region "Event handling"

    Protected Overrides Sub OnKeyUp(ByVal e As System.Windows.Forms.KeyEventArgs)
        MyBase.OnKeyUp(e)
        Select Case e.KeyCode
            Case Keys.F12
                Me.Close()
            Case Keys.F2
                If (Not KanBewaren) Then Return
                BewaarWijzigingen()
            Case Keys.F4
                If (Not tsbAfdrukken.Enabled) Then Return
                Afdrukken()
            Case Keys.F5
                If (Not tsbDetails.Enabled) Then Return
                BeheerDetails()
        End Select
    End Sub

    Protected Overrides Sub OnClosing(ByVal e As CancelEventArgs)
        MyBase.OnClosing(e)
        If (Not Me.Validate()) Then
            e.Cancel = True
            Return
        End If
        Me.VerkopenBindingSource.EndEdit()
        If (Utility.Data.HasChanges()) Then
            Dim result As DialogResult = MessageBox.Show("Deze verkoop bevat wijzigingen. Wil je de wijzigingen bewaren?", "Bewaren", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Exclamation)
            Select Case result
                Case DialogResult.Yes
                    BewaarWijzigingen()
                Case DialogResult.Cancel
                    e.Cancel = True
                    Me.DialogResult = Windows.Forms.DialogResult.Cancel
                    Return
                Case DialogResult.No
                    ' annuleer de wijzigingen en laat sluiten
                    Utility.Data.RejectChanges()
            End Select
        End If
    End Sub

    Private Sub tsbSluiten_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tsbSluiten.Click
        Me.DialogResult = Windows.Forms.DialogResult.OK
        Me.Close()
    End Sub

    Private Sub tsbBewaren_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tsbBewaren.Click
        BewaarWijzigingen()
    End Sub

    Private Sub tsbDetails_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tsbDetails.Click
        BeheerDetails()
    End Sub

    Private Sub tsbAfdrukken_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tsbAfdrukken.Click
        Afdrukken()
    End Sub

    Private Sub LinkDetails_LinkClicked(ByVal sender As System.Object, ByVal e As System.Windows.Forms.LinkLabelLinkClickedEventArgs) Handles LinkDetails.LinkClicked
        BeheerDetails()
    End Sub

    Private Sub VerkopenBindingSource_BindingComplete(ByVal sender As Object, ByVal e As BindingCompleteEventArgs) Handles VerkopenBindingSource.BindingComplete
        'KanBewaren = ArtikelsDataSet1.HasChanges() ' werkt niet
        If (Utility.HasDataChanged(e, VerkopenBindingSource.DataMember)) Then
            KanBewaren = True
        End If
    End Sub

#End Region

#Region "Private helpers"

    Private Function BewaarWijzigingen() As Integer
        Try
            If (Not Me.Validate()) Then Return 0
            Me.VerkopenBindingSource.EndEdit()
            Select Case _modus
                Case Modus.Bestaand
                    Dim verkopenTableAdapter As New ArtikelsDataSetTableAdapters.VerkopenTableAdapter
                    Dim aantal As Integer = verkopenTableAdapter.Update(_myVerkoopRow)
                    tsbDetails.Enabled = (_myVerkoopRow IsNot Nothing AndAlso _myVerkoopRow.Id > 0)
                    tsbAfdrukken.Enabled = (_myVerkoopRow IsNot Nothing AndAlso _myVerkoopRow.Id > 0)
                    Return aantal
                Case Modus.Nieuw
                    Dim aantalToegevoegd As Integer = Dal.VerkoopToevoegen(_myVerkoopRow)
                    ' _myVerkoopRow heeft nu de nieuwe ID gekregen
                    tsbDetails.Enabled = (_myVerkoopRow IsNot Nothing AndAlso _myVerkoopRow.Id > 0)
                    tsbAfdrukken.Enabled = (_myVerkoopRow IsNot Nothing AndAlso _myVerkoopRow.Id > 0)
                    Return aantalToegevoegd
            End Select
        Catch ex As Exception
            log.WriteError("VerkoopForm.BewaarWijzigingen", ex)
            MsgBox.ShowError("Er ging iets fout tijdens het bewaren van de verkoop. Controleer de gegevens en probeer later opnieuw.")
        End Try
    End Function

    Private Function InitialiseerVerkoop(ByVal totaalTelling As Decimal) As ArtikelsDataSet.VerkopenRow
        ' TODO echte tijd, soort invullen
        Dim verkoopRow As ArtikelsDataSet.VerkopenRow = Utility.Data.Verkopen.NewVerkopenRow()
        verkoopRow.IdKlant = Constants.DEFAULT_KLANT_ID
        verkoopRow.CashBetaald = True
        verkoopRow.IdWinkelier = Security.HuidigeWinkelierId
        verkoopRow.IdSoort = Constants.VerkoopsoortIds.WINKEL
        verkoopRow.Datum = DateTime.Today()
        verkoopRow.Tijd = "Niet van toepassing"
        verkoopRow.Begintotaal = totaalTelling
        verkoopRow.Eindtotaal = 0D
        verkoopRow.CommentaarBegintotaal = ""
        verkoopRow.CommentaarEindtotaal = ""
        verkoopRow.InUitKasBedrag = 0D
        verkoopRow.InUitKasReden = ""
        verkoopRow.NaarBankBedrag = 0D
        verkoopRow.NaarBankNaam = ""
        verkoopRow.NaarBankReferentie = ""
        Utility.Data.Verkopen.AddVerkopenRow(verkoopRow)
        Return verkoopRow
    End Function

    Private Sub BeheerDetails()
        ' TODO: indien kasblad gekozen werd, moet een telling gedaan worden?
        Dim f As New VerkoopDetailsForm(_myVerkoopRow.Id)
        f.ShowDialog()
    End Sub

    Private Sub Afdrukken()
        Try
            Select Case _myVerkoopRow.IdSoort
                Case Constants.VerkoopsoortIds.WINKEL
                    PrintUtility.PrintKasblad(_myVerkoopRow, Nothing, Nothing)
                Case Constants.VerkoopsoortIds.TUSSENDOOR
                    PrintUtility.PrintKasbladTussendoor(_myVerkoopRow)
                Case Constants.VerkoopsoortIds.FACTUUR
                    PrintUtility.PrintLeveringsbon(_myVerkoopRow.Id, 1, False)
                Case Else
                    ' TODO: stand of Tielt
                    MsgBox.ShowWarning("Dit soort verkoop kan (nog) niet afgedrukt worden")
            End Select
        Catch ex As Exception
            MsgBox.ShowError("Fout tijdens het afdrukken van de verkoop")
            log.WriteError("VerkoopForm.Afdrukken", ex)
        End Try
    End Sub

    Private Sub SetSecurity()
        Dim kanBeheren As Boolean = Security.IsAdmin() OrElse Security.IsWinkelwerking
        tsbDetails.Visible = kanBeheren
        tsbBewaren.Visible = kanBeheren
        LinkDetails.Visible = kanBeheren
        ToolStripSeparator1.Visible = kanBeheren
        ToolStripSeparator2.Visible = kanBeheren
        KanBewaren = kanBeheren
    End Sub

    Private Sub UpdateTotaal()
        Dim verkoop As New Verkoop(_myVerkoopRow)
        Dim totaal As Decimal = verkoop.TotaalMetLeeggoedEnCheques
        Me.tbTotaal.Text = totaal.ToString("N2")
        Me.tbBancontact.Text = verkoop.BedragBancontact.ToString("N2")
        Me.tbMaaltijdcheques.Text = verkoop.BedragMaaltijdcheques.ToString("N2")
    End Sub

#End Region

End Class